Exploiting origin server normalization for web cache deception
Web cache deception vía normalización del origin: el cache cachea todo lo que empieza por /resources mientras el origin resuelve traversal y sirve /my-account, guardando la API key en la caché.
Target Overview & Vulnerability Summary
El objetivo es obtener la API key de carlos. La regla de caché del cache server es de prefijo: todo lo que empieza por /resources se cachea. El origin server usa ? como delimitador y normaliza secuencias de path traversal (decodificando %2f a /). La URL /resources/..%2fmy-account?wcd hace que el origin sirva /my-account y que la caché guarde la respuesta bajo /resources/....
| Campo | Valor |
|---|---|
| Severidad | Alta (exfiltración de datos autenticados vía caché pública) |
| Endpoint vulnerable | /my-account (cacheado bajo prefijo /resources) |
| Root cause | Regla de caché por prefijo /resources + normalización del origin (? delimitador, traversal resuelto) |
Credenciales del laboratorio: wiener:peter. Se dispone de una lista de caracteres delimitadores.
Technical Breakdown & Exploitation Flow
1. La request deceptiva
GET /resources/..%2fmy-account?wcd HTTP/2
Host: <LAB-ID>.web-security-academy.net
Cookie: session=<SESSION_ID>
2. Comportamiento divergente
Cache server:
- La regla cachea cualquier asset cuyo path empiece por
/resources, sin importar lo que siga. /resources/..%2fmy-account?wcdcomienza con/resources→ decide cachear la respuesta.
Origin server:
- Usa
?como delimitador: ignora?wcddel path. - Normaliza la secuencia de traversal: decodifica
%2f→/y resuelve.., convirtiendo/resources/../my-accounten/my-account. - Sirve la página de cuenta del usuario autenticado — con su API key.
3. Resultado
La respuesta de /my-account (API key de carlos cuando la víctima la visita) se almacena en la caché bajo la clave /resources/..%2fmy-account?wcd. El atacante:
- Entrega la URL a
carlosvía el exploit server. - El navegador de la víctima carga la página de cuenta; el origin devuelve la API key.
- El cache server almacena la respuesta por su prefijo
/resources. - El atacante solicita la misma URL (o la clave cacheada) y obtiene la respuesta con la API key.
Root Cause Analysis
La discrepancia clave es la normalización del origin: el origin resuelve el path traversal (/resources/../my-account → /my-account) y aplica el delimitador ?, mientras el cache server decide la cacheabilidad antes de normalizar, basándose solo en el prefijo /resources. La regla de prefijo es demasiado amplia: cualquier URL que comience con /resources (incluso una que resuelva a una página dinámica) se cachea. La normalización del origin convierte la URL en un recurso dinámico mientras el prefijo la mantiene estática para la caché.
Secure Remediation
- Normalizar la URL (resolver traversal y decodificar) antes de aplicar las reglas de caché, de modo que la clave de caché y la decisión de cacheabilidad coincidan con el recurso efectivamente servido.
- Restringir la regla de prefijo: cachear solo paths que terminen en extensiones de assets estáticos (
/resources/*.js|.css|.png) y que no contengan secuencias de traversal. - Emitir
Cache-Control: private, no-storeen respuestas autenticadas y configurar el cache server para no cachear respuestas que contengan cookies de sesión. - Descartar del caching cualquier URL que, tras normalización, apunte a un endpoint dinámico.